<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    'use strict'
    // 问题1： set 和 deleteProperty 中需要返回布尔类型的值
    //        在严格模式下，如果返回 false 的话会出现type Error的异常
    // const target = {
    //   foo: 'xxx',
    //   bar: 'yyy',
    // }
    // const proxy = new Proxy(target, {
    //   // 监听访问
    //   get(target, key, receiver) {
    //     // return target[key]
    //     return Reflect.get(target, key, receiver)
    //   },
    //   // 监听赋值
    //   set(target, key, value, receiver) {
    //     // target[key] = value
    //     return Reflect.set(target, key, value, receiver)
    //   },
    //   // 监听删除
    //   deleteProperty(target, key) {
    //     // delete target[key]
    //     return Reflect.deleteProperty(target, key)
    //   }
    // })
    // proxy.foo = 'zzz'
    // delete proxy.foo

    // 问题2:  Proxy 和 Reflect 中使用receiver
    // Proxy 中 receiver: Proxy或者继承Proxy的对象
    // Reflect 中 receiver: 如果 target 对象中设置了getter, getter 中的this指向receiver
    const obj = {
      get foo() {
        console.log(this)
        return this.bar
      }
    }

    const proxy = new Proxy(obj, {
      get(target, key, receiver) {
        if(key === 'bar') {
          return 'value - bar'
        }
        return Reflect.get(target, key, receiver)
      }
    })
    console.log(proxy.foo);
  </script>
</body>
</html>